package com.at.source3;

import org.apache.flink.api.common.eventtime.WatermarkStrategy;
import org.apache.flink.api.common.typeinfo.Types;
import org.apache.flink.api.connector.source.util.ratelimit.RateLimiterStrategy;
import org.apache.flink.connector.datagen.source.DataGeneratorSource;
import org.apache.flink.connector.datagen.source.GeneratorFunction;
import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;

/**
 * @author huangchao E-mail:fengquan8866@163.com
 * @version 创建时间：2024/9/25 11:06
 */
public class DataGeneratorDemo4 {
    public static void main(String[] args) throws Exception {
        StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
        // 如果有n个并行度，最大值为a
        // 将述职 均分成 n 份，每个并行度生成 a/n 个数据
        env.setParallelism(3);
        /**
         * 数据生成器Source，四个参数：
         *   第一个：GeneratorFunction接口，需要实现，重写map方法，输入类型固定是Long
         *   第二个：Long类型，自动生成的数字序列（从0自增）的最大值（小于），达到这个值就停止了
         *   第三个：限速策略，比如 每秒生成几条数据
         *   第四个：返回的类型
         */
        DataGeneratorSource<String> dataGeneratorSource = new DataGeneratorSource<>(
                new GeneratorFunction<Long, String>() {
                    @Override
                    public String map(Long aLong) throws Exception {
                        return "Number:" + aLong;
                    }
                }, 100,
                RateLimiterStrategy.perSecond(1),
                Types.STRING
        );

        env
                .fromSource(dataGeneratorSource, WatermarkStrategy.noWatermarks(), "date-generator")
                .print();
        env.execute();
    }
}
